<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    
  </style>
</head>
<body>
  
</body>
<script>
  // console.log(a);

  // 预解析：声明提升

  // var的声明提升：提升到作用域最开始的位置，原位赋值
  // console.log(a);
  // var a;
  // console.log(a);
  // a = 10;
  // console.log(a);


  // function的声明提升：整体提升到作用域最开始的位置

  // console.log(fn)
  // function fn(){
  //   // 这是一个函数
  //   console.log(1)
  // }
  // console.log(fn)


  // 当var遇到function

  // var的变量和function的函数重名
    // 先提升var，声明一个变量（在内存中开启一个空间）,function a等同于直接占用这个空间
  // console.log(a);
  // var a = 10;
  // function a(){}
  // console.log(a);

  // 赋值式创建函数：只提升了var
  // console.log(fn);
  // var fn = function(){}
  // console.log(fn);


  // ==========


  // var和function重名：var提升的更高，所以function生效

  // ;(function(){

  //   console.log(a);   // f4
  //   var a = "hello"
  //   console.log(a);   // fhello
  //   function a(){ 1 }
  //   console.log(a);   // hello
  //   function a(){ 2 }
  //   console.log(a);   // hello
  //   var a = function(){ 3 }
  //   console.log(a);   // f3
  //   var a = "world"
  //   console.log(a);   // world
  //   function a(){ 4 }
  //   console.log(a);   // world

  // })();

  // 以上等价于以下

  // ;(function(){
  //   var a;
  //   var a;
  //   var a
  //   function a(){ 1 }
  //   function a(){ 2 }
  //   function a(){ 4 }

  //   console.log(a);   // f4
  //   a = "hello"
  //   console.log(a);   // hello
  //   console.log(a);   // hello
  //   console.log(a);   // hello
  //   a = function(){ 3 }
  //   console.log(a);   // f3
  //   a = "world"
  //   console.log(a);   // world
  //   console.log(a);   // world

  // })();



  
  ;(function(){
    console.log(a);
    function a(){ 1 }
    console.log(a);
    var a = function(){ 2 }
    console.log(a);
    function a(){ 3 }
    console.log(a);
    var a = "hello"
    console.log(a);
    a = function(){ 4 }
    console.log(a);
    function a(){ 5 }
    console.log(a);
  })();


</script>
</html>